package com.ycrlkj.android.modulespublic.common.net.Interceptor;

import android.util.Log;
import androidx.annotation.NonNull;
import com.blankj.utilcode.util.SPStaticUtils;
import com.ycrlkj.android.modulesbase.libbase.constant.BaseSettingsConstant;
import com.ycrlkj.android.modulespublic.common.net.exception.ApiException;
import com.ycrlkj.android.modulespublic.common.net.response.MResponseCode;
import java.io.IOException;
import lombok.SneakyThrows;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;

/**
 * 应用请求拦截器
 *
 *
 * Interceptor 分 应用请求拦截器 和 网络请求拦截器 两种, 写法相同, 只是向 HttpClient 添加的方式不一样
 *
 * Application  Interceptors:
 * 不需要担心是否影响OKHttp的请求策略和请求速度
 * 即使从缓存中取数据，也会执行Application拦截器
 * 允许重试，即Chain.proceed()可以执行多次。
 * 可以监听观察这个请求的最原始的未改变的意图(请求头，请求体等)，无法操作OKHttp为我们自动添加额外的请求头
 * 无法操作中间的响应结果，比如当URL重定向发生以及请求重试，只能操作客户端主动第一次请求以及最终的响应结果

 * Network Interceptors:
 * 可以修改OkHttp框架自动添加的一些属性，即允许操作中间响应，比如当请求操作发生重定向或者重试等。
 * 可以观察最终完整的请求参数（也就是最终服务器接收到的请求数据和熟悉）
 *
 * 添加应用请求拦截器: new OkHttpClient.Builder().addInterceptor(new 应用请求拦截器()).build();
 * 添加网络请求拦截器: new OkHttpClient.Builder().addNetworkInterceptor(new 网络请求拦截器()).build();
 * 同时添加两种拦截器: new OkHttpClient.Builder().addInterceptor(new 应用请求拦截器()).addNetworkInterceptor(new 网络请求拦截器()).build();
 */
public class ApplicationInterceptor implements Interceptor {

    @SneakyThrows
    @NonNull
    @Override
    public Response intercept(Chain chain) throws IOException {

        String token = SPStaticUtils.getString("token");

        Request request = chain.request().newBuilder()
                //.addHeader(name, value) 方法会添加一个同名header, .header(name, value) 方法会覆盖同名header
                .header("Token", token)
                .header("Content-Type", BaseSettingsConstant.HEADER_VALUE_CONTENT_TYPE)
                .header("Client-Type", BaseSettingsConstant.HEADER_VALUE_CLIENT_TYPE)
                .build();

        //拿到Response对象
        Response response = chain.proceed(request);

        int code = response.code();

        if(code >= 500){
            throw new ApiException(MResponseCode.ERROR_500.getCode(), MResponseCode.ERROR_500.getMessage());
        }else if(code == 404){
            throw new ApiException(MResponseCode.ERROR_404.getCode(), MResponseCode.ERROR_404.getMessage());
        }else if(code > 200){
            throw new ApiException(code * 10, "请求失败, httpStatus = " + code);
        }

        return response;
    }
}
